<?php
	/**
	  * @name		RGBColor
	  * @brief		Clase para generar propiedades RGB
	  * @author		Hermann D. Schimpf <hschimpf@gschimpf.com>
	  * @license	http://opensource.org/licenses/gpl-2.0.php
	  * @date		2010-02-21
	  * @version	0.1.0
  	**/

	final class RGBColor extends MyDebuger implements MyVersions {
		/**
		  * Version de la clase
		  * @access	private
		  * @static
		  * @name	$version
		**/
		private static $version			= 0;
		/**
		  * Subversion de la clase
		  * @access	private
		  * @static
		  * @name	$subversion
		**/
		private static $subversion		= 1;
		/**
		  * Revision de la clase
		  * @access	private
		  * @static
		  * @name	$revision
		**/
		private static $revision		= 0;

		/**
		  * Valor del color rojo
		  * @access	private
		  * @name	$red
		**/
		private $red	= 0;
		/**
		  * Valor del color verde
		  * @access	private
		  * @name	$green
		**/
		private $green	= 0;
		/**
		  * Valor del color azil
		  * @access	private
		  * @name	$blue
		**/
		private $blue	= 0;

		/**
		  * Constructor de la clase
		  * @access	public
		  * @param	Integer	$red		Valor del color Rojo
		  * @param	Integer	$green	Valor del color Verde
		  * @param	Integer	$blue		Valor del color Azul
		  * @param	Boolean	$debug	Valor booleano para habilitar la depuracion de la clase
		  * @return	Void		Este metodo no retorna valores
		 **/
		public function __construct($red = 0, $green = 0, $blue = 0, $debug = False) {
			/* creamos el padre */
			parent::__construct($debug, __CLASS__);
			/* almacenamos los colores */
			$this->catchExceptions('saveColors', $red, $green, $blue);
		}

		/**
		  * Destructor de la clase
		  * @access	public
		  * @return	Void		Este metodo no retorna valores
		 **/
		public function __destruct() {
			/* matamos el padre */
			parent::__destruct();
		}

		/**
		  * Metodo para obtener la version de la clase
		  * @access	public
		  * @static
		  * @return	String	Retorna la version de la clase con el formato: v{version}.{subversion}.{revision}
		 **/
		public static final function getVersion() {
			/* retornamos la version actual de la clase */
			return 'v' . self::$version . '.' . self::$subversion . '.' . self::$revision;
		}

		/**
		  * Metodo para obtener el color RGB completo
		  * @access	public
		  * @return	Integer	Valor del color RGB
		 **/
		public function getRGB($image) {
			/* retornamos el valor entero del color RGB */
			return imagecolorallocate($image, $this->getColor('red'), $this->getColor('green'), $this->getColor('blue'));
		}

		/**
		  * Metodo para almacenar los colores
		  * @access	private
		  * @return	Void	Este metodo no retorna resultados
		 **/
		private function saveColors($red, $green, $blue) {
			/* almacenamos el color rojo */
			$this->saveColor('red', $red);
			/* almacenamos el color verde */
			$this->saveColor('green', $green);
			/* almacenamos el color azul */
			$this->saveColor('blue', $blue);
		}

		/**
		  * Metodo para obtener el valor de un color
		  * @access	private
		  * @param	String	ID del color a obtener
		  * @return	Integer	Valor del color
		 **/
		private function getColor($colorId) {
			/* retornamos el valor del color */
			return $this->$colorId;
		}

		/**
		  * Metodo para almacenar el valor de un color
		  * @access	private
		  * @param	String	ID del color a almacenar
		  * @param	Integer	Valor del color
		  * @return	Void		Este metodo no retorna resultados
		 **/
		private function saveColor($colorId, $colorValue) {
			/* mostramos un mensaje */
			$this->show('Almacenando valor ' . $this->italic($colorValue) . ' para el color ' . $this->italic($colorId) . '..', False);
			/* almacenamos el valor del color */
			$this->$colorId = $colorValue;
			/* mostramos ok al mensaje */
			$this->showOK();
		}

		/**
		  * Metodo para capturar excepciones en la ejecucion de los metodos
		  * @access	private
		  * @param	String	$method	Nombre del metodo a ejecutar
		  * @return	Void		Este metodo no retorna valores
		 **/
		private function catchExceptions($method = Null) {
			/* ingresamos a un control de errores para capturar mis excepciones */
			try {
				/* ingresamos a un control de errores para capturar las excepciones de ejecucion */
				try {
					/* realizamos algunas verificaciones */
					$this->verificarMetodo($method);
					/* obtenemos los parametros recibidos */
					$args = func_get_args();
					/* llamamos al metodo con los parametros */
					return call_user_func_array(Array(__CLASS__, $method), $this->buildArgs($args));
				/* capturamos las excepciones */
				} catch (Exception $e) {
					/* capturamos todos los errores y los transformamos en mi excepcion */
					$this->newException($e);
				}
			/* capturamos mis excepciones */
			} catch (MyException $e) {
				/* si se produjo una excepcion la manejamos con el metodo 'show' */
				$this->show($e->getMensaje());
			}
		}
	}
?>